﻿#include <iostream>
#include <string>
#include <list>
using namespace std;
/* 对象结构型模式
1.意图
将对象组合成树形结果以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性
2.适用性
a.你想表示对象的部分-整体层次结构
b.你希望用户忽略组合对象与单个对象的不同，用户将统一地使用组合结构中的所有对象
*/
class Root
{
public:
	virtual void Display() = 0;
	virtual void Add(Root* file) = 0;
	virtual void Remove(Root* file) = 0;
	virtual list<Root*> GetChild() = 0;
};

class File : public Root
{
public:
	File(string name):name(name){}
	void Display()
	{
		cout << name << endl;
	}
	void Add(Root* file) {}
	void Remove(Root* file) {}
	list<Root*> GetChild() { return m_list; }
private:
	string name;
	list<Root*> m_list;
};
class Folder : public Root
{
public:
	Folder(string name):name(name){}
	void Display()
	{
		cout << name << endl;
	}
	void Add(Root* file)
	{
		m_list.push_back(file);
	}
	void Remove(Root* file)
	{
		m_list.erase(remove(m_list.begin(), m_list.end(), file), m_list.end());
	}
	list<Root*> GetChild()
	{
		return m_list;
	}
private:
	string name;
	list<Root*> m_list;
};

void ShowTree(Root* root,int level)
{
	list<Root*> m_tree;
	for (int i = 0; i < level; i++)
	{
		cout << "--";
	}
	root->Display();
	m_tree = root->GetChild();
	if(!m_tree.empty())
	{ 
		for (auto v : m_tree)
		{
			if (v->GetChild().empty())
			{
				for (int i = 0; i <= level; i++)
				{
					cout << "--";
				}
				v->Display();
			}
			else
			{
				ShowTree(v, level + 1);
			}
		}
	}	
}
/*
int main()
{
	Folder* root = new Folder("D:");
	Folder* dir1 = new Folder("dir1");
	Folder* dir2 = new Folder("dir2");
	File* t1 = new File("t1.txt");
	File* t2 = new File("t2.txt");

	root->Add(dir1);
	root->Add(dir2);
	dir1->Add(t1);
	dir2->Add(t1);
	dir2->Add(t2);
	ShowTree(root,0);
	dir1->Add(dir2);
	ShowTree(root,0);
	dir1->Remove(t1);
	ShowTree(root, 0);
	
	return 0;
}
*/